package cin.ufpe.br.GDI.Dados;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import cin.ufpe.br.GDI.Entidades.Endereco;
import cin.ufpe.br.GDI.Entidades.Fotografo;
import cin.ufpe.br.GDI.Entidades.Reporter;

public class RepositorioReporter {


	private Connection conn;


	public RepositorioReporter(Connection conn) {

		this.conn = conn;
	}

	public void inserirReporter (Reporter reporter) throws SQLException{

		Statement statement = conn.createStatement();
		
		String queryInsertEndereco= "INSERT INTO tb_endereco VALUES(ENDERECO_SQ.NEXTVAL,'"
									+ reporter.getEndereco().getLogradouro()+"',"
									+"'"+ reporter.getEndereco().getCidade() +"',"
									+"'"+ reporter.getEndereco().getEstado() +"',"
									+"'"+ reporter.getEndereco().getCEP()+"')";
		
		System.out.println(queryInsertEndereco);
		System.out.println(statement.executeUpdate(queryInsertEndereco));

		String queryInsertReporter = "INSERT INTO tb_reporter SELECT " 
			+reporter.getCPF()+ ", "
			+"'"+ reporter.getNome()+"',"
			+"'"+reporter.getSexo() +"',"
			+"'"+reporter.getFuncao()+"',"
			+"to_date('"+reporter.getDataNascimento()+"','dd/mm/yyyy'),"
			+"to_date('"+reporter.getDataAdmissao()+"','dd/mm/yyyy'),"
			+"'"+reporter.getEmail() +"',"
			+"v_telefone(";

		for(int i=0;i<reporter.getTelefones().size();i++){

			queryInsertReporter=queryInsertReporter+"'"
			+reporter.getTelefones().elementAt(i)+"'";

			if(i==reporter.getTelefones().size()-1){

			}else{
				queryInsertReporter=queryInsertReporter+",";
			}


		}
		
		 queryInsertReporter = queryInsertReporter+ "),"
		 +"REF(e),";
		 
		 String queryIdEndereco = "SELECT ENDERECO_SQ.CURRVAL AS idEndereco FROM DUAL";
		 ResultSet rs = statement.executeQuery(queryIdEndereco);
		 rs.next();
		 int idEndereco = rs.getInt("idEndereco");
		 
		 if(reporter.getCooredenador()!=null){
			 
			 queryInsertReporter=queryInsertReporter
			 +"(SELECT REF(c) from tb_reporter c WHERE c.cpf="
			 + reporter.getCooredenador().getCPF()+") "
			 +"FROM tb_endereco e WHERE e.id="+idEndereco;
			 
			 
		 }else{
			 
			 queryInsertReporter=queryInsertReporter
			 +"NULL FROM tb_endereco e WHERE e.id="+idEndereco;
			  
			 
		 }
		 System.out.println(queryInsertReporter);
		 
		System.out.println(statement.executeUpdate(queryInsertReporter));
		conn.commit();
		
		
	}	
	
	public void removerReporter(Reporter r) throws SQLException {
		
		Statement st = conn.createStatement();
		String query = "DELETE FROM tb_reporter WHERE cpf = "+r.getCPF()+"";
		st.executeUpdate(query);
		conn.commit();
		st.close();
	}
	
	public Reporter buscarReporter (long cpf) throws SQLException {
		Reporter retorno = null;
		Statement st = conn.createStatement();
		String query = "SELECT R.*, to_char(R.data_nascimento) as dataNascimento, to_char(R.data_admissao) as dataAdmissao, R.coordenador.cpf as cpfCoordenador, R.endereco.cep as cep, R.endereco.cidade as cidade" +
		", R.endereco.logradouro as logradouro, R.endereco.estado as estado FROM tb_reporter R WHERE R.cpf = "+cpf;
		
		ResultSet rs = st.executeQuery(query);
		
		while(rs.next()) {
			String nome, sexo, funcao, dataNascimento, dataAdmissao, email;
			Endereco endereco;
			long CPF;
			Vector<String> telefones = new Vector<String>();
			
			nome = rs.getString("nome");
			sexo = rs.getString("sexo");
			funcao = rs.getString("funcao");
			dataNascimento = rs.getString("dataNascimento");
			dataAdmissao = rs.getString("dataAdmissao");
			email = rs.getString("email");
			CPF = rs.getLong("cpf");
			
			ResultSet rs2 = rs.getArray("telefone").getResultSet();
			while(rs2.next()) {
				telefones.add(rs2.getString(2));
			}
			
			String CEP = rs.getString("endereco");
			String cidade = rs.getString("cidade");
			String logradouro = rs.getString("logradouro");
			String estado = rs.getString("estado");
			
			
			endereco = new Endereco(CEP, cidade, logradouro, estado);
			
			retorno = new Reporter(nome, sexo, funcao, dataNascimento, dataAdmissao, email, telefones, endereco, CPF, null);
						
		}
		
		return retorno;
		
	}

	public Vector<Reporter> buscarReporter(String nomeReporter) throws SQLException {
		Vector<Reporter> retorno = new Vector<Reporter>();
		Statement st = conn.createStatement();


		String query = "SELECT R.*, to_char(R.data_nascimento) as dataNascimento, to_char(R.data_admissao) as dataAdmissao, R.coordenador.cpf as cpfCoordenador, R.endereco.cep as cep, R.endereco.cidade as cidade" +
				", R.endereco.logradouro as logradouro, R.endereco.estado as estado FROM tb_reporter R WHERE LOWER(R.nome) LIKE '%"+nomeReporter.toLowerCase()+"%'";
		System.out.println(query);

		ResultSet rs = st.executeQuery(query);
		
		while(rs.next()) {
			String nome, sexo, funcao, dataNascimento, dataAdmissao, email;
			Endereco endereco;
			long CPF;
			Vector<String> telefones = new Vector<String>();
			
			nome = rs.getString("nome");
			sexo = rs.getString("sexo");
			funcao = rs.getString("funcao");
			dataNascimento = rs.getString("dataNascimento");
			dataAdmissao = rs.getString("dataAdmissao");
			email = rs.getString("email");
			CPF = rs.getLong("cpf");
			
			long cpfCoordenador = rs.getLong("cpfCoordenador");
			Reporter coordenador = buscarReporter(cpfCoordenador);
			
			ResultSet rs2 = rs.getArray("telefone").getResultSet();
			while(rs2.next()) {
				telefones.add(rs2.getString(2));
			}
			
			for (int i = 0; i < telefones.size(); i++)
				System.out.println(telefones.get(i));
			
			String CEP = rs.getString("endereco");
			String cidade = rs.getString("cidade");
			String logradouro = rs.getString("logradouro");
			String estado = rs.getString("estado");
			
			
			endereco = new Endereco(CEP, cidade, logradouro, estado);
			

		//	Reporter f = new Reporter(nome, sexo, funcao, dataNascimento, dataAdmissao, email, telefones, endereco, CPF,);

			Reporter r = new Reporter(nome, sexo, funcao, dataNascimento, dataAdmissao, email, telefones, endereco, CPF, coordenador);

			

		//	retorno.add(f);

			retorno.add(r);

		}
		
		return retorno;
	}
	
//	public static void main(String[] args) {
//		ConexaoBD conexao = new ConexaoBD();
//		try {
//			conexao.conectarBD();
//			RepositorioReporter rp = new RepositorioReporter(conexao.getConn());
//			Vector<Reporter> funcionarios = rp.buscarReporter("o");
//			
//			for (int i = 0; i < funcionarios.size(); i++) {
//				System.out.println(funcionarios.get(i).getNome());
//				if (funcionarios.get(i).getCooredenador() != null) System.out.println("Coordenado por: "+funcionarios.get(i).getCooredenador().getNome());
//			}
//			
//			
//		} catch (ClassNotFoundException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
	
}
